<?php
/**
 * Componente para manejo de archivos
 */

/**
 *Componente para manejar y administrar archivos
 * Permite
 * <ul>
 *  <li> Subir fotos</li>
 *  <li> Subir Archivos especificados en los formatos permitidos</li>
 *  <li> Eliminar fotos</li>
 * </ul>
 *@author Luis Gabriel Rodriguez <luisgabriel84@gmail.com>
 *@subpackage componentens
 */

class FilehandlerComponent extends Object
{
        /**
        *@var array formatos de imagen permitidos
        * @access public
        */
    
        var $pictureFormats = array('jpg', 'png','gif','bmp','jpeg');
        /**
        *@var array formatos de archivos permitidos
        *@access public
        */
        var $documentFormats = array('doc','pdf','xls','ppt','zip','rar','gz','swf','fla','psd');

        /**
         *
         * Convierte una palabra en url amigable
         * @param $string string a convertir en url
         * @return string convertida (slug)
         * @access public
         */
        function slug( $string )
        {
                $slug =trim( $string );
                $slug = strtolower( $string ); 
                $slug = preg_replace( '/[^a-z0-9- ]/', '', $slug );
		$slug = str_replace( '  ', ' ', $slug );
                $slug = str_replace( ' ', '-', $slug );
                return $slug;
        }
        /**
         * Subir un solo archivo
         *@param folder de destino
         *@param archivo binario
         *@return string|bool  Si logra subir la foto retorna el nombre que genero sino retorna falso
         * @access public
         */

        function upload_single_file( $folder, $archivo_file )
        {
                $folder_destino = WWW_ROOT . $folder;
                $rel_url = $folder;
                //datos del arhivo
                $nombre_archivo = $archivo_file['name'];
                $tipo_archivo = $archivo_file['type'];
                $tamano_archivo = $archivo_file['size'];
                
                //compruebo si las características del archivo son las que deseo

             	$archivo = explode( ".", $nombre_archivo );
             	$archivo_nombre = $this->clean_image_name( $archivo[0] );
             
             	$tam = count( $archivo );
                //generar un numero aleatorio para agregar al archivo
                $key = rand();
                $archivo_extension = $this->slug( $archivo[$tam-1] );
                    	
                $nombre_final_archivo = $archivo_nombre . $key. "." . $archivo_extension;
                
                if ( move_uploaded_file( $archivo_file['tmp_name'] , $folder_destino . $nombre_final_archivo) )
                {
                        chmod( $folder_destino.$nombre_final_archivo,0777 );
                        
                        return $nombre_final_archivo;
                        
                }
                else
                {
                        return false;
                }
   
        }
        /**
         * Obtiene la extension de un archivo
         *
         * @param Nombre del archivo
         * @return string Extencion del archivo
         * @access public
         */
            function getFileType( $file =null )
            {
                if (!$file)
                {
                        return false;
                }
                
                $i = strrpos($file,".");
                if (!$i) 
                { 
                        return ""; 
                }
                $l = strlen($file) - $i;
                $ext = substr($file,$i+1,$l);
                return $ext;
                
            
            }
            /**
             *
             * Sube una foto
             * @param string  $folder Folder de destino
             * @param string  $picture Nombre archivo
             * @param integer $widthLargeImage Ancho de la nueva imagen
             * @param integer $widthThumb Ancho de la imagen miniatura si no se especifica no se crea
             * @return string|bool  Si logra subir la foto retorna el nombre que genero sino retorna falso
             * @access public
             */
        
        function uploadpicture( $folder = null,$picture = null, $widthLargeImage = false,$widthThumb = false )
        {
        
                if(!$picture)
                {
                        return false;
                }
                
                $type = $this->slug($this->getFileType( $picture['name'] ));
                $allowedfiles = $this->pictureFormats;
                
                if( in_array($type, $allowedfiles) )
                {
                        
                        $pictureName = $this->upload_single_file( $folder, $picture );
              
                        if( $widthLargeImage )
                        {
                                $this->resize_img(WWW_ROOT . $folder. $pictureName, $widthLargeImage, WWW_ROOT . $folder. $pictureName) ;
                        }
                        
                        if( $widthThumb )
                        {
			        $this->resize_img(WWW_ROOT . $folder. $pictureName, $widthThumb, WWW_ROOT . $folder. 'thumbs/' . $pictureName ) ;
			}
		
			return $pictureName;
                }
                else
                {
                        return false;
                }
         }
         
         /**
          *
          * Elimina un archivo
          *
          * @access public
          * @param string $location Folder donde se encuentra el archivo
          * @param string $file Nombre del archivo a eliminar
          * @param bool $thumb Si el archivo es una foto y tiene imagen en miniatura; establecer a
          * true para que sea elininada tambien buscara en la carpeta 'thumbs'
          * Ejemplos:
          * <code>
          * <?php
          *     $this->Filehandler->deleteFile('img/productos','foto.jpg',true)
          * ?>
          * </code>
          */
        
        function deleteFile( $location, $file , $thumb = false)
        {
                if( file_exists( WWW_ROOT .$location.$file) && $file != "" )
		{
		    unlink(WWW_ROOT .$location.$file);
		}
		
		if ( $thumb )
		{
		        if( file_exists( WWW_ROOT .$location.'/thumbs/'.$file) && $file != "" )
		        {
		                unlink(WWW_ROOT .$location.'/thumbs/'.$file);
		        }
		}
        }
        
        /**
         *
         * Redimensiona una imagen al ancho especificado
         *
         * @param string $imgname Nombre que se le va a dar al la imagen
         * @param integer $size Nuevo ancho de la imagen
         * @param string $filename Nombre del archivo
         * @access public
         */
        function resize_img($imgname, $size, $filename)    
        {
                $filetype = $this->getFileType($imgname);
                $filetype = strtolower($filetype);

                switch($filetype) 
                {
                    case "jpeg":
                    case "jpg":
                            $img_src = ImageCreateFromjpeg ($imgname);
                            break;
                    case "gif":
                            $img_src = imagecreatefromgif ($imgname);
                            break;
                    case "png":
                            $img_src = imagecreatefrompng ($imgname);
                            break;
                }

                $true_width = imagesx($img_src);
                $true_height = imagesy($img_src);

                if ($true_width>=$true_height)
                {
                    $width=$size;
                    $height = ( $width/$true_width ) * $true_height;
                }
                else
                {
                    $width=$size;
                    $height = ( $width/ $true_width ) * $true_height;
                }
                $img_des = ImageCreateTrueColor( $width,$height );
                imagecopyresampled ($img_des, $img_src, 0, 0, 0, 0, $width, $height, $true_width, $true_height);

                // Save the resized image
                switch($filetype)
                {
                    case "jpeg":
                    case "jpg":
                             imagejpeg($img_des,$filename,80);
                             chmod($filename,0777);
                             break;
                     case "gif":
                             imagegif($img_des,$filename,80);
                             chmod($filename,0777);
                             break;
                     case "png":
                             imagepng($img_des,$filename,80);
                             chmod($filename,0777);
                             break;
                }
                
        }
        
            /**
             *
             * Borra los caracteres especiales del nombre de una imagen
             * @param string $name Nombre de la imagen
             * @return string $name Nombre de la imagen sin caracteres
             * @access public
             */
            function clean_image_name( $name ) 
             {
               $name = $this->slug( $name ); 
               $code_entities_match = array( '&quot;' ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'+' ,'{' ,'}' ,'|' ,':' ,'"' ,'<' ,'>' ,'?' ,'[' ,']' ,'' ,';' ,"'" ,',' ,'_' ,'/' ,'*' ,'+' ,'~' ,'`' ,'=' ,' ' ,'---' ,'--','--'); 
               $code_entities_replace = array('' ,'-' ,'-' ,'' ,'' ,'' ,'-' ,'-' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'-' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'-' ,'-' ,'-' ,'' ,'' ,'' ,'' ,'' ,'-' ,'-' ,'-','-'); 
               $name = str_replace($code_entities_match, $code_entities_replace, $name); 
               return $name; 
            }
}
?>